#include "ota_memchunk.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "thirdparty/log.h"


/// @brief 初始化一个可变字符串
/// @param chunk MemChunk对象
/// @return 
int ota_memchunk_init(MemChunk *chunk)
{
    //之可以初始化一次 先释放这个chunk
    ota_memchunk_free(chunk);
    //开启空间
    chunk->data = malloc(1);
    //判断是否成功
    if(chunk->data == NULL)
    {
        //失败
        log_warn("ota_memchunk_init fail");
        return -1;
    }
    //初始化长度 0   开启的一个位置是 \0
    chunk->size = 0;
    chunk->data[0] = 0;
    log_trace("ota_memchunk_init succeed");
    return 0;
}

/// @brief 把一个数据家在chunk后面
/// @param chunk 可变字符串
/// @param data 数据
/// @param size 数据长度
/// @return 
int ota_memchunk_append(MemChunk *chunk, void *data, int size)
{
    //给chunk加内存  加1  是给\0刘的
    char * str = realloc(chunk->data,chunk->size + size +1);
    //判断成功没有
    if(str == NULL)
    {
        //失败
        log_warn("ota_memchunk_append fail");
        return -1;
    }
    chunk->data = str;
    //把数据加在chunk后买年
    memcpy(chunk->data + chunk->size,data,size);
    chunk->size += size;
    chunk->data[chunk->size] = 0;  //加上 \0
    log_trace("ota_memchunk_append succeed");
    return 0;
}

/// @brief 释放一个可变字符串
/// @param chunk 
void ota_memchunk_free(MemChunk *chunk)
{
    //释放
    free(chunk->data);
    log_trace("ota_memchunk_free succeed");
}